home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 501_600 / DISK0579 / DISK0579.ZIP / CHAP09.TXT < prev    next >
Text File  |  1989-12-01  |  19KB  |  414 lines

  1.  
  2.  
  3.  
  4.  
  5.                                                     Chapter 9
  6.                                                       RECORDS
  7.  
  8.  
  9. A VERY SIMPLE RECORD
  10. ____________________________________________________________
  11.  
  12. We come to the grandaddy of all data         ================
  13. structures in Pascal, the record.  A           SMALLREC.PAS
  14. record is composed of a number of            ================
  15. variables any of which can be of any
  16. predefined data type, including other
  17. records.  Rather than spend time trying to define a record in
  18. detail, lets go right to the first example program,
  19. SMALLREC.PAS.  This is a program using nonsense data that will
  20. illustrate the use of a record.
  21.  
  22. There is only one entry in the type declaration part of the
  23. program, the record identified by the name Description.  The
  24. record is composed of three fields, the Year, Model, and
  25. Engine variables.  Notice that the three fields are each of
  26. a different type, indicating that the record can be of mixed
  27. types.  You have a complete example of the way a record is
  28. defined before you.  It is composed of the identifier
  29. Description, the = sign, the reserved word record, the list
  30. of elements, and followed by the reserved word end.  This is
  31. one of the places in Pascal where an end is used without a
  32. corresponding begin.  Notice that this only defines a type,
  33. it does not define any variables.  That is done in the var
  34. declaration where the variable Truck is defined as a record
  35. of type Description and Cars is defined to have 10 complete
  36. records of the type Description.  The variable Truck has three
  37. components, Year, Model, and Engine, and any or all of these
  38. components can be used to store data pertaining to Truck.
  39.  
  40. When assigning data to the variable Truck, for example, there
  41. are actually three parts to the variable, so we use three
  42. assignment statements, one for each of the sub-fields.  In
  43. order to assign values to the various sub-fields, the variable
  44. name is followed by the sub-field name with a separating
  45. period.  The "var.sub_field" combination is a variable name.
  46.  
  47. Keep in mind that Truck is a complete record containing three
  48. variables, and to assign or use one of the variables, you must
  49. designate which sub-field you are interested in.  Examine
  50. lines 16 through 18 of the program where the three fields are
  51. assigned meaningless data for illustration.  The Year field
  52. is assigned an integer number, the Model field is assigned the
  53. name Pickup, and the Engine variable is assigned the value
  54. Diesel.
  55.  
  56. A loop is then used to assign data to all 10 records of Car. 
  57. In order to further illustrate that there are actually 30
  58.  
  59.                                                      Page 9-1
  60.  
  61.                                                       Records
  62.  
  63. variables in use here, a few are changed at random in lines
  64. 26 through 30, being very careful to maintain the required
  65. types as defined in the type declaration part of the program. 
  66. Finally, all ten composite variables, consisting of 30 actual
  67. variables in a logical grouping are printed out using the same
  68. "var.sub-field" notation described above.
  69.  
  70. If the preceding description of a record is not clear in your
  71. mind, review it very carefully.  It's a very important concept
  72. in Pascal, and you won't have a hope of a chance of
  73. understanding the next example until this one is clear.  Be
  74. sure to compile and run SMALLREC.PAS so you can study the
  75. output.
  76.  
  77.  
  78.  
  79. A SUPER RECORD
  80. ____________________________________________________________
  81.  
  82. Examine the Pascal example file BIGREC.PAS   ================
  83. for a very interesting record.  First we        BIGREC.PAS
  84. have a constant defined.  Ignore it for      ================
  85. the moment, we will come back to it later. 
  86. Within the type declaration we have three
  87. records defined, and upon close examination, you will notice
  88. that the first two records are included as part of the
  89. definition of the third record.  The record identified as
  90. Person, actually contains 9 variable definitions, three within
  91. the Full_Name record, three of its own, and three within the
  92. Date record.  This is a type declaration and does not actually
  93. define any variables, that is done in the var part of the
  94. program.
  95.  
  96. The var part of the program defines some variables beginning
  97. with the array of Friend containing 50 (because of the
  98. constant definition in the const part) records of the user
  99. defined type, Person.  Since the type Person defines 9 fields,
  100. we have now defined 9 times 50 = 450 separate and distinct
  101. variables, each with its own defined type.  Remember that
  102. Pascal is picky about assigning data by the correct type. 
  103. Each of the 450 separate variables has its own type associated
  104. with it, and the compiler will generate an error if you try
  105. to assign any of those variables the wrong type of data. 
  106. Since Person is a type definition, it can be used to define
  107. more than one variable, and in fact it is used again to define
  108. three more records, Self, Mother, and Father.  These three
  109. records are each composed of 9 variables, so we have 27 more
  110. variables which we can manipulate within the program.  Finally
  111. we have the variable Index defined as a simple byte type
  112. variable.
  113.  
  114.  
  115.  
  116.  
  117.  
  118.                                                      Page 9-2
  119.  
  120.                                                       Records
  121.  
  122. HOW TO MANIPULATE ALL OF THAT DATA
  123. ____________________________________________________________
  124.  
  125. In the program we begin by assigning data to all of the fields
  126. of Self in lines 31 through 43.  Examining the first three
  127. statements of the main program, we see the construction we
  128. learned in the last example program being used, namely the
  129. period between descriptor fields.  The main record is named
  130. Self, and we are interested in the first part of it,
  131. specifically the Name part of the Person record.  Since the
  132. Name part of the Person record is itself composed of three
  133. parts, we must designate which component of it we are
  134. interested in.  Self.Name.First_Name is the complete
  135. description of the first name of Self and is used in the
  136. assignment statement in line 31 where it is assigned the name
  137. of "Charley".  The next two fields are handled in the same way
  138. and are self explanatory.
  139.  
  140.  
  141. WHAT IS THE WITH STATEMENT?
  142. ____________________________________________________________
  143.  
  144. Continuing on to the fourth field, the City, there are only
  145. two levels required because City is not another record
  146. definition.  The fourth field is therefore completely defined
  147. by Self.City.  Notice the with Self do statement.  This is a
  148. shorthand notation used with record definitions to simplify
  149. coding.  From the begin in line 34 to the matching end in line
  150. 43, any variables within the Self record are used as though
  151. they had a Self. in front of them.  It greatly simplifies
  152. coding to be able to omit the leading identifier within the
  153. with section of code.  You will see that City, State, and
  154. Zipcode are easily assigned values without further reference
  155. to the Self variable.  When we get to the Day part of the
  156. birthday, we are back to three levels and the complete
  157. definition is Self.Birthday.Day but once again, the Self. part
  158. is taken care of automatically because we are still within the
  159. with Self do area.
  160.  
  161. To illustrate the with statement further, another is
  162. introduced in line 39, with Birthday do, and an area is
  163. defined by the begin end pair which extends from line 39
  164. through line 42.  Within this area both leading identifiers
  165. are handled automatically to simplify coding, and Month is
  166. equivalent to writing Self.Birthday.Month if both with
  167. statements were removed.  
  168.  
  169.  
  170. HOW FAR DOWN CAN YOU NEST THE WITH STATEMENT?
  171. ____________________________________________________________
  172.  
  173. You may be wondering how many levels of nesting are allowed
  174. in record definitions.  There doesn't appear to be a limit
  175. according to the Pascal definition, but we do get a hint at
  176.  
  177.                                                      Page 9-3
  178.  
  179.                                                       Records
  180.  
  181. how far it is possible to go.  In TURBO Pascal, you are
  182. allowed to have with statements nested to nine levels, and it
  183. would be worthless to nest with statements deeper than the
  184. level of records.  Any program requiring more levels than nine
  185. is probably far beyond the scope of your programming ability,
  186. and mine, for a long time.
  187.  
  188. After assigning a value to Year, the entire record of Self is
  189. defined, all nine variables.  It should be pointed out that
  190. even though Self is composed of nine separate variables, it
  191. is proper to call Self a variable itself because it is a
  192. record variable.
  193.  
  194.  
  195. SUPER-ASSIGNMENT STATEMENTS
  196. ____________________________________________________________
  197.  
  198. The statement in line 45, "Mother := Self;" is very
  199. interesting.  Since both of these are records, both are the
  200. same type of record, and both therefore contain 9 variables,
  201. Pascal is smart enough to recognize that, and assign all nine
  202. values contained in Self to the corresponding variables of
  203. Mother.  So after one statement, the record variable Mother
  204. is completely defined.  The statement in line 46 assigns the
  205. same values to the nine respective variables of Father, and
  206. the next two lines assign all 50 Friend variables the same
  207. data.  By this point in the program, we have therefore
  208. generated 450 + 27 = 477 separate pieces of data so far in
  209. this program.  We could print it all out, but since it is
  210. nonsense data, it would only waste time and paper.  Lines 49
  211. through 52 write out three sample pieces of the data for your
  212. inspection.
  213.  
  214.  
  215. WHAT GOOD IS ALL OF THIS
  216. ____________________________________________________________
  217.  
  218. It should be obvious to you that what this program does, even
  219. though the data is nonsense, appears to be the beginning of
  220. a database management system, which indeed it is.  Instead of
  221. assigning nonsense data, a list could be read in and stored
  222. for manipulation.  It is a crude beginning, and has a long way
  223. to go to be useful, but you should see a seed for a useful
  224. program.
  225.  
  226. Now to go back to the const in line 4 as promised.  The number
  227. of friends was defined as 50 and used for the size of the
  228. array and in the assignment loop in line 47.  You can now edit
  229. this number and see how big this database can become on your
  230. computer.  If you are using TURBO Pascal, you will be limited
  231. to slightly more than 1000 because of the 64K limitation of
  232. an executable program, and the fact that all of this data is
  233. stored within that 64K boundary.  It should be noted that
  234. TURBO Pascal 4.0 or 5.x allows a program larger than 64K but
  235.  
  236.                                                      Page 9-4
  237.  
  238.                                                       Records
  239.  
  240. still places a limitation of 64K on each compilation unit. 
  241. See how big you can make the number of friends before you get
  242. the memory overflow message.  Keep the number in mind because
  243. when we get to the chapter on Pointers and Dynamic Allocation,
  244. you will see a marked increase in allowable size, especially
  245. if you have a large amount of RAM installed in your computer.
  246.  
  247.  
  248. A VARIANT RECORD
  249. ____________________________________________________________
  250.  
  251. If any part of this chapter is still unclear, it would be good
  252. for you to go back and review it at this time.  The next
  253. example will really tax your mind to completely understand it,
  254. and this will be true especially if the prior material is not
  255. clear.
  256.  
  257. Examine the Pascal program VARREC.PAS for    ================
  258. an example of a program with a variant          VARREC.PAS
  259. record definition.  In this example, we      ================
  260. first define a scalar type, namely
  261. Kind_Of_Vehicle for use within the record. 
  262. Then we have a record defining Vehicle, intended to define
  263. several different vehicles, each with different kinds of data. 
  264. It would be possible to define all variables for all types of
  265. vehicles, but it would be a waste of storage space to define
  266. the number of tires for a boat, or the number of propeller
  267. blades used on a car or truck.  The variant record lets us
  268. define the data precisely for each vehicle without wasting
  269. data storage space.
  270.  
  271.  
  272. WHAT IS A TAG-FIELD?
  273. ____________________________________________________________
  274.  
  275. In the record definition we have the usual record header
  276. followed by three variables defined in the same manner as the
  277. records in the last two example programs.  Then we come to the
  278. case statement.  Following this statement, the record is
  279. different for each of the four types defined in the associated
  280. scalar definition.  The variable What_Kind is called the
  281. tag-field and must be defined as a scalar type prior to the
  282. record definition.  The tag-field is used to select the
  283. variant, when the program uses one of the variables of this
  284. record type.  The tag-field is followed by a colon and its
  285. type definition, then the reserved word of.  A list of the
  286. variants is then given, with each of the variants having the
  287. variables for its particular case defined.  The list of
  288. variables for one variant is called the field list.
  289.  
  290. A few rules are in order at this point.  The variants do not
  291. have to have the same number of variables in each field list,
  292. and in fact, one or more of the variants may have no variables
  293. at all in its variant part.  If a variant has no variables,
  294.  
  295.                                                      Page 9-5
  296.  
  297.                                                       Records
  298.  
  299. it must still be defined with a pair of empty parentheses
  300. followed by a semi-colon.  All variables in the entire variant
  301. part must have unique names.  The three variables, Wheels,
  302. Tires, and Tyres, all mean the same thing to the user, but
  303. they must be different for the compiler.  You may use the same
  304. identifiers again in other records and for simple variables
  305. anywhere else in the program.  The Pascal compiler can tell
  306. which variable you mean by its context.  Using the same
  307. variable name should be discouraged as bad programming
  308. practice because it may confuse you or another person trying
  309. to understand your program at a later date.  
  310.  
  311. The final rule is that the variant part of the record must be
  312. the last part of it, and in fact, the last part of any or all
  313. variants can itself have a variant part to it.  That is
  314. getting pretty advanced for our level of use of Pascal at this
  315. time however.
  316.  
  317.  
  318. USING THE VARIANT RECORD
  319. ____________________________________________________________
  320.  
  321. We properly define four variables with the record type Vehicle
  322. in line 22 and go on to examine the program itself.
  323.  
  324. We begin by defining one of our variables of type Vehicle,
  325. namely the variable named Ford.  The seven lines assigning
  326. values to Ford are similar to the prior examples with the
  327. exception of line 28.  In that line the tag-field which
  328. selects the particular variant used is set equal to the value
  329. Truck, which is a scalar definition, not a variable.  This
  330. means that the variables named Motor, Tires, and Payload are
  331. available for use with the record Ford, but the variables
  332. named Wheels, Engine, Tyres, etc. are not available in the
  333. record named Ford.
  334.  
  335. Next, we will define the record Sunfish as a Boat, and define
  336. all of its variables in lines 33 through 41.  All of Sunfish's
  337. variables are defined but in a rather random order to
  338. illustrate that they need not be defined in a particular
  339. order.  You should remember the with statement from the last
  340. example program.
  341.  
  342. To go even further in randomly assigning the variables to a
  343. record, we redefine Ford as having an Engine which it can only
  344. have if it is a car.  This is one of the fine points of the
  345. Pascal record.  If you assign any of the variant variables,
  346. the record is changed to that variant, but it is the
  347. programmers responsibility to assign the correct tag-field to
  348. the record, not Pascal's.  Good programming practice would be
  349. to assign the tag-field before assigning any of the variant
  350. variables.  The remainder of the Ford variables are assigned
  351. to complete that record, the non-variant part remaining from
  352. the last assignment.
  353.  
  354.                                                      Page 9-6
  355.  
  356.                                                       Records
  357.  
  358.  
  359. The variable Mac is now set equal to the variable Sunfish in
  360. line 48.  All variables within the record are copied to Mac
  361. including the tag-field, making Mac a Boat.
  362.  
  363.  
  364. NOW TO SEE WHAT WE HAVE IN THE RECORDS
  365. ____________________________________________________________
  366.  
  367. We have assigned Ford to be a car, and two boats exist, namely
  368. Sunfish and Mac.  Since Schwinn was never defined, it has no
  369. data in it, and is at this point useless.  The Ford tag-field
  370. has been defined as a car, so it should be true in the if
  371. statement, and the message in line 51 should print.  The
  372. Sunfish is not a bicycle, so it will not print.  The Mac has
  373. been defined as a boat in the single assignment statement, so
  374. it will print a message with an indication that all of the
  375. data in the record was transferred to its variables.
  376.  
  377. Even though we can make assignment statements with records,
  378. they cannot be used in any mathematical operations such as
  379. addition, or multiplication.  They are simply used for data
  380. storage.  It is true however, that the individual elements in
  381. a record can be used in any mathematical statements legal for
  382. their respective types.
  383.  
  384. One other point should be mentioned.  The tag-field can be
  385. completely eliminated resulting in a "free union" variant
  386. record.  This is possible because Pascal, as you may remember
  387. from above, will automatically assign the variant required
  388. when you assign data to one of the variables within a variant. 
  389. This is the reason that all variables within any of the
  390. variants must have unique names.  The free union record should
  391. be avoided in your early programming efforts because you
  392. cannot test a record to see what variant it has been assigned
  393. to it.  It is definitely an advanced technique in Pascal.
  394.  
  395. Be sure you compile and run VARREC.PAS and study the output
  396. until you understand it completely.
  397.  
  398.  
  399. PROGRAMMING EXERCISE
  400. ____________________________________________________________
  401.  
  402. 1.   Write a simple program with a record to store the names
  403.      of five of your friends and display the names.
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.                                                      Page 9-7
  414.